package net.esj.auth.manager;

import java.util.List;

import net.esj.auth.AuthException;
import net.esj.auth.pojo.CoreAdmin;
import net.esj.auth.pojo.CoreAuthFunc;
import net.esj.auth.pojo.CoreAuthGroup;
import net.esj.auth.pojo.CoreAuthModel;
import net.esj.basic.utils.Pagination;

public interface AuthManager {

	/**
	 * 获得带有权限的用户
	 * @param id
	 * @return
	 */
	CoreAdmin getAdminWithAuth(String id);
	
	List findFunctions(CoreAuthFunc parent,CoreAuthModel model,int priority,boolean allChildren,boolean withDisabled);
	
	
	List findFunctionsByParent(CoreAuthFunc parent);
	
	void saveOrUpdateFunction(CoreAuthFunc func);
	
	/**
	 * 
	 * @param group 如果group中的functions为null则不重新设置 否则重设
	 */
	void saveAuthGroupAndResetFuncs(CoreAuthGroup group);
	
	/**
	 * 管理员授予组权限
	 * @param admin
	 * @param groups
	 */
	void grantGroups(CoreAdmin admin,List<CoreAuthGroup> groups);
	
	/**
	 * 管理员授予单个权限
	 * @param admin
	 * @param groups
	 */
	void grantFuncs(CoreAdmin admin,List<CoreAuthFunc> funcs);
	
	void saveOrUpdateAdmin(CoreAdmin admin);
	
	void deleteAdmin(CoreAdmin admin);
	
	/**
	 * 删除某个权限，根据系统配置是否可以强制删除已被授权的权限，如果已被授予而系统不允许强制删除则抛出异常
	 * @param func
	 * @throws AuthException 
	 */
	void deleteFunc(CoreAuthFunc func) throws AuthException;
	
	/**
	 * 删除某个权限组，根据系统配置是否可以强制删除已被授权的权限，如果已被授予而系统不允许强制删除则抛出异常
	 * @param group
	 * @return 这个权限组的名称
	 * @throws AuthException
	 */
	String deleteGroup(CoreAuthGroup group) throws AuthException;
	
	/**
	 * 核查用户名是否重复
	 * @param name
	 * @return true 已存在 false 不存在
	 */
	boolean checkUsernameExist(String name);
	
	CoreAuthModel saveOrUpdateModel(CoreAuthModel model);
	
	List<CoreAuthGroup> allGroup(CoreAuthModel model);
	
	List<CoreAuthModel> allModels();
	
	Pagination<CoreAdmin> pageAdmin(Pagination page, CoreAdmin admin);
	/**
	 * 复制权限
	 * @name 被复制的对象的名称(全称)
	 * @id 复制的对象ID
	 * */
	CoreAdmin getAdminWithName(String name,String id);
	
	List findMyFunctions(CoreAdmin admin);
	
	List<String> getChildAdmin(String id,List<String> list);

	List<CoreAuthGroup> listGroupByAdmin(List<String> list);
	
}
